#include "File_Deal.h"

//************************************
// Method:    	File_Size_Get		获取文件大小
// Programmer:  lww
// Time:		2018/12/17
// Returns:   	int					获取成功，返回文件大小，获取失败，返回-1
// Parameter: 	char * File_Path	文件路径
//************************************
int File_Size_Get(const char* File_Path)
{
	struct stat statbuff;
	if (-1 == stat(File_Path, &statbuff))
	{
		//printf("Stat wrong in %s\r\n",File_Path);
		return -1;
	}
	else
	{
		return (int)statbuff.st_size;
	}
}

//************************************
// Method:    	File_Exist_Check		文件是否存在检测函数
// Programmer:  lww
// Time:		2018/12/22
// Returns:   	bool					存在返回true，不存在返回false
// Parameter: 	char * File_Path		待检测的文件的路径
//************************************
bool File_Exist_Check(const char* File_Path)
{
	int File_Size = 0;
	File_Size = File_Size_Get(File_Path);
	if (File_Size != -1)
		return true;
	else
		return false;
}


//************************************
// Method:    	Del_File			删除文件函数
// Programmer:  lww
// Time:		2018/12/22
// Returns:   	bool				true-成功；false-失败
// Parameter: 	char * File_Path	被删除的文件的路径
//************************************
bool Del_File(const char* File_Path)
{
	if (File_Exist_Check(File_Path) == true)
	{
		if (remove(File_Path) == -1)
			return false;
		else
			return true;
	}
	return false;
}


//************************************
// Method:    	Path_Create			创建路径函数
// Programmer:  lww
// Time:		2019/3/21
// Returns:   	bool				成功：true；失败-false
// Parameter: 	char * Path			文件路径
//************************************
bool Path_Create(const char* Path)
{
	FILE* fp = NULL;							//< 文件指针
	
	fp = fopen(Path, "rb");						//< 验证下位控制器是否有该文件夹，若没有，则自动加
	if (fp == NULL)
	{
		printf("%s does't exist!\r\n", Path);
		umask(0); //作用：设置允许当前进程创建文件或者目录最大可操作的权限（0：给后面的代码调用函数mkdir给出最大的权限，避免了创建目录或文件的权限不确定性）
		if (mkdir(Path, 0777) == 0) //mkdir(Path, 0777): 创建 Path目录或文件 , 0777(可读可写)
			printf("%s is successfully created\r\n", Path);
		else
		{
			printf("Problem creating directory %s\r\n", Path);
			return false;
		}		
	}
	else
	{
		printf("%s EXISITS!\r\n", Path);
		fclose(fp);
	}
	return true;
}


//************************************
// Method:    	Open2Read					打开并读取文件
// Programmer:  lww
// Time:		2019/2/16
// Returns:   	bool
// Parameter: 	char * File_Path			文件路径
// Parameter: 	void * * File_Start_Point	读取文件到内存后的地址的地址
// Parameter: 	void * * File_Point			读取文件到内存后的地址的地址
// Parameter: 	int * File_Size				文件大小的指针
//************************************
bool Open2Read(const char* File_Path, void** File_Start_Point, void** File_Point, int* File_Size)
{
#define WRONG_DEAL	{\
	fclose(fp);\
	free(File_Start_Point[0]);\
	return false;\
}

	FILE* fp;		//< 文件指针

	//< 获取文件大小
	File_Size[0] = File_Size_Get(File_Path);
	if (File_Size[0] == -1)
		return false;

	//< 根据文件大小开辟内存空间存储文件
	File_Start_Point[0] = calloc(File_Size[0], sizeof(char));
	File_Point[0] = File_Start_Point[0];

	//< 打开文件
	fp = fopen(File_Path, "rb");
	if (fp == NULL)
		WRONG_DEAL;

	//< 读取文件到内存中
#define DATA_BLOCK_NUM 1
	if ((fread(File_Start_Point[0], File_Size[0], DATA_BLOCK_NUM, fp)) != DATA_BLOCK_NUM)
		WRONG_DEAL;
#undef DATA_BLOCK_NUM

#undef WRONG_DEAL

	fclose(fp);
	return true;
}




//************************************
// Method:    	Open2Read2					打开并按行读取文件
// Programmer:  lbj
// Time:		2021/12/17
// Returns:   	bool
// Parameter: 	char * File_Path			文件路径
// Parameter: 	char *IP_address[]		存储IP的指针数组
//************************************
bool Open2Read2(const char* File_Path,  char *IP_address[])
{
#define WRONG_DEAL	{\
	fclose(fp);\
	return false;\
}
char szTest[10][30] = {};
FILE *fp = fopen(File_Path, "r");
if ( fp== NULL) WRONG_DEAL;
int len = 0;
while (!feof(fp)){
	if (fgets(szTest[len], sizeof(szTest) - 1, fp) == NULL)
		break;
	IP_address[len] = szTest[len];
	len++;
}
#undef WRONG_DEAL
fclose(fp);
return true;
}


//************************************
// Method:    	Open2Write					打开并写入文件
// Programmer:  lww
// Time:		2019/1/4
// Returns:   	bool
// Parameter: 	char * File_Path			文件路径
// Parameter: 	long File_Offset			指针偏移
// Parameter: 	void * Data					写入的数据
// Parameter: 	int Data_Size				写入的数据字节数
//************************************
bool Open2Write(const char* File_Path, long File_Offset, void* Data, int Data_Size)
{
#define WRONG_DEAL	{\
	fclose(fp);\
	return false;\
}
#define DATA_BLOCK_NUM 1

	FILE* fp;		//< 文件指针
	int File_Size;

	//< 获取文件大小，查看文件是否存在
	File_Size = File_Size_Get(File_Path);
	if (File_Size == -1)
		return false;

	//< 打开文件
	fp = fopen(File_Path, "rb+");		//< duan0605 rb+ 使用二进制模式打开文件，可以进行更新，即可以读取、写入文件
	if (fp == NULL)
		WRONG_DEAL;

	//< 将文件指针定位到指定位置
	if (fseek(fp, File_Offset, SEEK_SET) != 0)		//< duan0605 第二个参数为偏移量（offset）,表示从起始点开始要移动的距离  第三个参数为模式，标识起点。SEEK_SET：文件开始
		WRONG_DEAL;

	//< 写入相关内容
	if (DATA_BLOCK_NUM != fwrite(Data, Data_Size, DATA_BLOCK_NUM, fp))
		WRONG_DEAL;

#undef DATA_BLOCK_NUM
#undef WRONG_DEAL

	fclose(fp);
	return true;
}

//自写int转字符串函数,尽量用sprintf函数
void itoaself(int i, char* string)
{
	int power, j;
	j = i;
	for (power = 1; j >= 10; j /= 10)
		power *= 10;
	for (; power > 0; power /= 10) {
		*string++ = '0' + i / power;
		i %= power;
	}
	*string = '\0';
}



//在pcBuf中取pcp与pcb之间的值传在pcRes中
int GetNumBetweenPara34(char *pcBuf, char *pcRes, char *pcp, char *pcb)
{
	char *pcBegin = NULL;
	char *pcEnd = NULL;
	pcBegin = strstr(pcBuf, pcp);
	pcEnd = strstr(pcBuf, pcb);
	if (pcBegin == NULL || pcEnd == NULL || pcBegin > pcEnd) {
		printf("Mail name not found!\n");
	}
	else {
		pcBegin += strlen("#n ");
		memcpy(pcRes, pcBegin, pcEnd - pcBegin);
	}
	return 1;
}